﻿//using System;
//using System.Collections.Generic;
//using System.Text;
//using System.ComponentModel;
//using System.Reflection;

//namespace TerryDong.Core
//{
//    public static class ListExtension
//    {
//        public static KeyValuePair<string,bool>  GetLastSortCondition (this List<T> list)
//        {

//            return new KeyValuePair<string, bool>();
//        }

//public static KeyValuePair<string,bool>  SetSortCondition (this List<T> list ,string propertyName,bool ascending)
//        {
//            return new KeyValuePair<string,bool>(propertyName,ascending);
//        }

//        /// <summary>
//        /// 排序
//        /// </summary>
//        /// <param name="propertyName">属性名称</param>
//        /// <param name="ascending">如果设置<c>true</c> 升序</param>
//        public static void Sort(this List<T> list, string propertyName, bool ascending)
//        {

//            string _propertyName=GetLastSortCondition(list).Key;
//            bool _ascending = GetLastSortCondition(list).Value;
//            if (_propertyName == propertyName && _ascending == ascending)
//                _ascending = !ascending;
//            else
//            {
//                _propertyName = propertyName;
//                _ascending = ascending;
//            }

//            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
//            PropertyDescriptor propertyDesc = properties.Find(propertyName, true);

//            // 应用排序
//            PropertyComparer<T> pc = new PropertyComparer<T>(propertyDesc, (_ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending);
//            list.Sort(pc);
//        }
//    }

//    /// <summary>
//    /// 属性比较类
//    /// </summary>
//    class PropertyComparer<T> : System.Collections.Generic.IComparer<T>
//    {

//        private PropertyDescriptor _property;
//        private ListSortDirection _direction;

//        public PropertyComparer(PropertyDescriptor property, ListSortDirection direction)
//        {
//            _property = property;
//            _direction = direction;
//        }

//        #region IComparer<T>

//        public int Compare(T xWord, T yWord)
//        {
//            // 获取属性
//            object xValue = GetPropertyValue(xWord, _property.Name);
//            object yValue = GetPropertyValue(yWord, _property.Name);

//            // 调用升序或降序方法
//            if (_direction == ListSortDirection.Ascending)
//            {
//                return CompareAscending(xValue, yValue);
//            }
//            else
//            {
//                return CompareDescending(xValue, yValue);
//            }
//        }

//        public bool Equals(T xWord, T yWord)
//        {
//            return xWord.Equals(yWord);
//        }

//        public int GetHashCode(T obj)
//        {
//            return obj.GetHashCode();
//        }

//        #endregion

//        /// <summary>
//        /// 比较任意类型属性升序
//        /// </summary>
//        /// <param name="xValue">X值</param>
//        /// <param name="yValue">Y值</param>
//        /// <returns></returns>
//        private int CompareAscending(object xValue, object yValue)
//        {
//            int result;

//            // 如果值实现了IComparer接口
//            if (xValue is IComparable)
//            {
//                result = ((IComparable)xValue).CompareTo(yValue);
//            }
//            // 如果值没有实现IComparer接口，但是它们是相等的
//            else if (xValue.Equals(yValue))
//            {
//                result = 0;
//            }
//            // 值没有实现IComparer接口且它们是不相等的, 按照字符串进行比较
//            else result = xValue.ToString().CompareTo(yValue.ToString());

//            return result;
//        }

//        /// <summary>
//        /// 比较任意类型属性降序
//        /// </summary>
//        /// <param name="xValue">X值</param>
//        /// <param name="yValue">Y值</param>
//        /// <returns></returns>
//        private int CompareDescending(object xValue, object yValue)
//        {
//            return CompareAscending(xValue, yValue) * -1;
//        }

//        /// <summary>
//        /// 获取属性值
//        /// </summary>
//        /// <param name="value">对象</param>
//        /// <param name="property">属性</param>
//        /// <returns></returns>
//        private object GetPropertyValue(T value, string property)
//        {
//            // 获取属性
//            PropertyInfo propertyInfo = value.GetType().GetProperty(property);

//            // 返回值
//            return propertyInfo.GetValue(value, null);
//        }

//    }
//}
